+Sun Feb 21 14:21:46 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkwindow.c: removed debugging statements
+ about embedded XID's. They could have been
+ moved to the new PLUGSOCKET debug key, but they weren't
+ really useful anyways.
+
+ * gdk/gdk.h: Added gdk_error_trap_push/pop to provide
+ a clean interface to the gdk_error_code functionality
+ of trapping X errors.
+
+ * gtk/gtkplug.c gtk/gtksocket.c: Add error
+ traps around accesses to foreign windows.
+
Sun Feb 21 15:37:25 1999 Tim Janik <timj@gtk.org>
* gtk/gtkwindow.h: marked gtk_window_set_focus, gtk_window_set_default,
+Sun Feb 21 14:21:46 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkwindow.c: removed debugging statements
+ about embedded XID's. They could have been
+ moved to the new PLUGSOCKET debug key, but they weren't
+ really useful anyways.
+
+ * gdk/gdk.h: Added gdk_error_trap_push/pop to provide
+ a clean interface to the gdk_error_code functionality
+ of trapping X errors.
+
+ * gtk/gtkplug.c gtk/gtksocket.c: Add error
+ traps around accesses to foreign windows.
+
Sun Feb 21 15:37:25 1999 Tim Janik <timj@gtk.org>
* gtk/gtkwindow.h: marked gtk_window_set_focus, gtk_window_set_default,
+Sun Feb 21 14:21:46 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkwindow.c: removed debugging statements
+ about embedded XID's. They could have been
+ moved to the new PLUGSOCKET debug key, but they weren't
+ really useful anyways.
+
+ * gdk/gdk.h: Added gdk_error_trap_push/pop to provide
+ a clean interface to the gdk_error_code functionality
+ of trapping X errors.
+
+ * gtk/gtkplug.c gtk/gtksocket.c: Add error
+ traps around accesses to foreign windows.
+
Sun Feb 21 15:37:25 1999 Tim Janik <timj@gtk.org>
* gtk/gtkwindow.h: marked gtk_window_set_focus, gtk_window_set_default,
+Sun Feb 21 14:21:46 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkwindow.c: removed debugging statements
+ about embedded XID's. They could have been
+ moved to the new PLUGSOCKET debug key, but they weren't
+ really useful anyways.
+
+ * gdk/gdk.h: Added gdk_error_trap_push/pop to provide
+ a clean interface to the gdk_error_code functionality
+ of trapping X errors.
+
+ * gtk/gtkplug.c gtk/gtksocket.c: Add error
+ traps around accesses to foreign windows.
+
Sun Feb 21 15:37:25 1999 Tim Janik <timj@gtk.org>
* gtk/gtkwindow.h: marked gtk_window_set_focus, gtk_window_set_default,
+Sun Feb 21 14:21:46 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkwindow.c: removed debugging statements
+ about embedded XID's. They could have been
+ moved to the new PLUGSOCKET debug key, but they weren't
+ really useful anyways.
+
+ * gdk/gdk.h: Added gdk_error_trap_push/pop to provide
+ a clean interface to the gdk_error_code functionality
+ of trapping X errors.
+
+ * gtk/gtkplug.c gtk/gtksocket.c: Add error
+ traps around accesses to foreign windows.
+
Sun Feb 21 15:37:25 1999 Tim Janik <timj@gtk.org>
* gtk/gtkwindow.h: marked gtk_window_set_focus, gtk_window_set_default,
+Sun Feb 21 14:21:46 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkwindow.c: removed debugging statements
+ about embedded XID's. They could have been
+ moved to the new PLUGSOCKET debug key, but they weren't
+ really useful anyways.
+
+ * gdk/gdk.h: Added gdk_error_trap_push/pop to provide
+ a clean interface to the gdk_error_code functionality
+ of trapping X errors.
+
+ * gtk/gtkplug.c gtk/gtksocket.c: Add error
+ traps around accesses to foreign windows.
+
Sun Feb 21 15:37:25 1999 Tim Janik <timj@gtk.org>
* gtk/gtkwindow.h: marked gtk_window_set_focus, gtk_window_set_default,
+Sun Feb 21 14:21:46 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkwindow.c: removed debugging statements
+ about embedded XID's. They could have been
+ moved to the new PLUGSOCKET debug key, but they weren't
+ really useful anyways.
+
+ * gdk/gdk.h: Added gdk_error_trap_push/pop to provide
+ a clean interface to the gdk_error_code functionality
+ of trapping X errors.
+
+ * gtk/gtkplug.c gtk/gtksocket.c: Add error
+ traps around accesses to foreign windows.
+
Sun Feb 21 15:37:25 1999 Tim Janik <timj@gtk.org>
* gtk/gtkwindow.h: marked gtk_window_set_focus, gtk_window_set_default,
typedef struct _GdkPredicate GdkPredicate;
+typedef struct _GdkErrorTrap GdkErrorTrap;
struct _GdkPredicate
{
gpointer data;
};
+struct _GdkErrorTrap
+{
+ gint error_warnings;
+ gint error_code;
+};
+
/*
* Private function declarations
*/
static guint32 timer_val; /* The timeout length as specified by
* the user in milliseconds.
*/
-
static gint autorepeat;
+static GSList *gdk_error_traps = NULL; /* List of error traps */
+static GSList *gdk_error_trap_free_list = NULL; /* Free list */
+
#ifdef G_ENABLE_DEBUG
static const GDebugKey gdk_debug_keys[] = {
{"events", GDK_DEBUG_EVENTS},
}
gchar *
-gdk_get_display(void)
+gdk_get_display (void)
{
return (gchar *)XDisplayName (gdk_display_name);
}
+/*************************************************************
+ * gdk_error_trap_push:
+ * Push an error trap. X errors will be trapped until
+ * the corresponding gdk_error_pop(), which will return
+ * the error code, if any.
+ * arguments:
+ *
+ * results:
+ *************************************************************/
+
+void
+gdk_error_trap_push (void)
+{
+ GSList *node;
+ GdkErrorTrap *trap;
+
+ if (gdk_error_trap_free_list)
+ {
+ node = gdk_error_trap_free_list;
+ gdk_error_trap_free_list = gdk_error_trap_free_list->next;
+ }
+ else
+ {
+ node = g_slist_alloc();
+ node->data = g_new (GdkErrorTrap, 1);
+ }
+
+ node->next = gdk_error_traps;
+ gdk_error_traps = node;
+
+ trap = node->data;
+ trap->error_code = gdk_error_code;
+ trap->error_warnings = gdk_error_warnings;
+
+ gdk_error_code = 0;
+ gdk_error_warnings = 0;
+}
+
+/*************************************************************
+ * gdk_error_trap_pop:
+ * Pop an error trap added with gdk_error_push()
+ * arguments:
+ *
+ * results:
+ * 0, if no error occured, otherwise the error code.
+ *************************************************************/
+
+gint
+gdk_error_trap_pop (void)
+{
+ GSList *node;
+ GdkErrorTrap *trap;
+ gint result;
+
+ g_return_val_if_fail (gdk_error_traps != NULL, 0);
+
+ node = gdk_error_traps;
+ gdk_error_traps = gdk_error_traps->next;
+
+ node->next = gdk_error_trap_free_list;
+ gdk_error_trap_free_list = node;
+
+ result = gdk_error_code;
+
+ trap = node->data;
+ gdk_error_code = trap->error_code;
+ gdk_error_warnings = trap->error_warnings;
+
+ return result;
+}
+
gint
gdk_send_xevent (Window window, gboolean propagate, glong event_mask,
XEvent *event_send)
void gdk_exit (gint error_code);
gchar* gdk_set_locale (void);
+/* Push and pop error handlers for X errors
+ */
+void gdk_error_trap_push (void);
+gint gdk_error_trap_pop (void);
+
+
gboolean gdk_events_pending (void);
GdkEvent* gdk_event_get (void);
Window root, parent;
Window *children = NULL;
guint nchildren;
-
- if (!XGetWindowAttributes (gdk_display, anid, &attrs)) {
- g_warning ("XGetWindowAttributes failed on window ID %d\n", anid);
+ gboolean result;
+
+ gdk_error_trap_push ();
+ result = XGetWindowAttributes (gdk_display, anid, &attrs);
+ if (gdk_error_trap_pop () || !result)
+ return NULL;
+
+ /* FIXME: This is pretty expensive. Maybe the caller should supply
+ * the parent */
+ gdk_error_trap_push ();
+ result = XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
+ if (gdk_error_trap_pop () || !result)
return NULL;
- }
private = g_new (GdkWindowPrivate, 1);
window = (GdkWindow*) private;
- /* FIXME: This is pretty expensive. Maybe the caller should supply
- * the parent */
- XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
-
if (children)
XFree (children);
private->parent = gdk_xid_table_lookup (parent);
* it a delete event, as if we were a WM
*/
XClientMessageEvent xevent;
-
+
+ gdk_error_trap_push ();
gdk_window_hide (window);
gdk_window_reparent (window, NULL, 0, 0);
xevent.format = 32;
xevent.data.l[0] = gdk_wm_delete_window;
xevent.data.l[1] = CurrentTime;
-
+
XSendEvent (private->xdisplay, private->xwindow,
False, 0, (XEvent *)&xevent);
+ gdk_flush ();
+ gdk_error_trap_pop ();
}
}
else if (xdestroy)
typedef struct _GdkPredicate GdkPredicate;
+typedef struct _GdkErrorTrap GdkErrorTrap;
struct _GdkPredicate
{
gpointer data;
};
+struct _GdkErrorTrap
+{
+ gint error_warnings;
+ gint error_code;
+};
+
/*
* Private function declarations
*/
static guint32 timer_val; /* The timeout length as specified by
* the user in milliseconds.
*/
-
static gint autorepeat;
+static GSList *gdk_error_traps = NULL; /* List of error traps */
+static GSList *gdk_error_trap_free_list = NULL; /* Free list */
+
#ifdef G_ENABLE_DEBUG
static const GDebugKey gdk_debug_keys[] = {
{"events", GDK_DEBUG_EVENTS},
}
gchar *
-gdk_get_display(void)
+gdk_get_display (void)
{
return (gchar *)XDisplayName (gdk_display_name);
}
+/*************************************************************
+ * gdk_error_trap_push:
+ * Push an error trap. X errors will be trapped until
+ * the corresponding gdk_error_pop(), which will return
+ * the error code, if any.
+ * arguments:
+ *
+ * results:
+ *************************************************************/
+
+void
+gdk_error_trap_push (void)
+{
+ GSList *node;
+ GdkErrorTrap *trap;
+
+ if (gdk_error_trap_free_list)
+ {
+ node = gdk_error_trap_free_list;
+ gdk_error_trap_free_list = gdk_error_trap_free_list->next;
+ }
+ else
+ {
+ node = g_slist_alloc();
+ node->data = g_new (GdkErrorTrap, 1);
+ }
+
+ node->next = gdk_error_traps;
+ gdk_error_traps = node;
+
+ trap = node->data;
+ trap->error_code = gdk_error_code;
+ trap->error_warnings = gdk_error_warnings;
+
+ gdk_error_code = 0;
+ gdk_error_warnings = 0;
+}
+
+/*************************************************************
+ * gdk_error_trap_pop:
+ * Pop an error trap added with gdk_error_push()
+ * arguments:
+ *
+ * results:
+ * 0, if no error occured, otherwise the error code.
+ *************************************************************/
+
+gint
+gdk_error_trap_pop (void)
+{
+ GSList *node;
+ GdkErrorTrap *trap;
+ gint result;
+
+ g_return_val_if_fail (gdk_error_traps != NULL, 0);
+
+ node = gdk_error_traps;
+ gdk_error_traps = gdk_error_traps->next;
+
+ node->next = gdk_error_trap_free_list;
+ gdk_error_trap_free_list = node;
+
+ result = gdk_error_code;
+
+ trap = node->data;
+ gdk_error_code = trap->error_code;
+ gdk_error_warnings = trap->error_warnings;
+
+ return result;
+}
+
gint
gdk_send_xevent (Window window, gboolean propagate, glong event_mask,
XEvent *event_send)
Window root, parent;
Window *children = NULL;
guint nchildren;
-
- if (!XGetWindowAttributes (gdk_display, anid, &attrs)) {
- g_warning ("XGetWindowAttributes failed on window ID %d\n", anid);
+ gboolean result;
+
+ gdk_error_trap_push ();
+ result = XGetWindowAttributes (gdk_display, anid, &attrs);
+ if (gdk_error_trap_pop () || !result)
+ return NULL;
+
+ /* FIXME: This is pretty expensive. Maybe the caller should supply
+ * the parent */
+ gdk_error_trap_push ();
+ result = XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
+ if (gdk_error_trap_pop () || !result)
return NULL;
- }
private = g_new (GdkWindowPrivate, 1);
window = (GdkWindow*) private;
- /* FIXME: This is pretty expensive. Maybe the caller should supply
- * the parent */
- XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
-
if (children)
XFree (children);
private->parent = gdk_xid_table_lookup (parent);
* it a delete event, as if we were a WM
*/
XClientMessageEvent xevent;
-
+
+ gdk_error_trap_push ();
gdk_window_hide (window);
gdk_window_reparent (window, NULL, 0, 0);
xevent.format = 32;
xevent.data.l[0] = gdk_wm_delete_window;
xevent.data.l[1] = CurrentTime;
-
+
XSendEvent (private->xdisplay, private->xwindow,
False, 0, (XEvent *)&xevent);
+ gdk_flush ();
+ gdk_error_trap_pop ();
}
}
else if (xdestroy)
attributes_mask |= (window->title ? GDK_WA_TITLE : 0);
attributes_mask |= (window->wmclass_name ? GDK_WA_WMCLASS : 0);
+ gdk_error_trap_push ();
widget->window = gdk_window_new (plug->socket_window,
&attributes, attributes_mask);
+ gdk_flush ();
+ if (gdk_error_trap_pop ()) /* Uh-oh */
+ {
+ gdk_error_trap_push ();
+ gdk_window_destroy (widget->window);
+ gdk_flush ();
+ gdk_error_trap_pop ();
+ widget->window = gdk_window_new (NULL, &attributes, attributes_mask);
+ }
+
((GdkWindowPrivate *)widget->window)->window_type = GDK_WINDOW_TOPLEVEL;
gdk_window_set_user_data (widget->window, window);
if (!GTK_CONTAINER (window)->focus_child)
{
gtk_window_set_focus (GTK_WINDOW (widget), NULL);
-
+
+ gdk_error_trap_push ();
XSetInputFocus (GDK_DISPLAY (),
GDK_WINDOW_XWINDOW (plug->socket_window),
RevertToParent, event->time);
+ gdk_flush ();
+ gdk_error_trap_pop ();
gtk_plug_forward_key_press (plug, event);
}
xevent.xkey.keycode = XKeysymToKeycode(GDK_DISPLAY(),
event->keyval);
xevent.xkey.same_screen = TRUE; /* FIXME ? */
-
+
+ gdk_error_trap_push ();
XSendEvent (gdk_display,
GDK_WINDOW_XWINDOW (plug->socket_window),
False, NoEventMask, &xevent);
+ gdk_flush ();
+ gdk_error_trap_pop ();
}
/* Copied from Window, Ughh */
xevent.xfocus.mode = EMBEDDED_APP_WANTS_FOCUS;
xevent.xfocus.detail = FALSE; /* Don't force */
+ gdk_error_trap_push ();
XSendEvent (gdk_display,
GDK_WINDOW_XWINDOW (plug->socket_window),
False, NoEventMask, &xevent);
+ gdk_flush ();
+ gdk_error_trap_pop ();
}
}
socket->plug_window = gdk_window_lookup (id);
+ gdk_error_trap_push ();
+
if (socket->plug_window && socket->plug_window->user_data)
{
/*
else
{
socket->plug_window = gdk_window_foreign_new (id);
+ if (!socket->plug_window) /* was deleted before we could get it */
+ {
+ gdk_error_trap_pop ();
+ return;
+ }
+
socket->same_app = FALSE;
socket->have_size = FALSE;
gdk_window_hide (socket->plug_window);
gdk_window_reparent (socket->plug_window, widget->window, 0, 0);
+
+ gdk_flush ();
+ gdk_error_trap_pop ();
+
socket->need_map = TRUE;
}
{
XSizeHints hints;
long supplied;
+
+ gdk_error_trap_push ();
if (XGetWMNormalHints (GDK_DISPLAY(),
GDK_WINDOW_XWINDOW (socket->plug_window),
}
}
socket->have_size = TRUE; /* don't check again? */
+
+ gdk_error_trap_pop ();
}
requisition->width = socket->request_width;
if (socket->plug_window)
{
+ gdk_error_trap_push ();
+
if (!socket->need_map &&
(allocation->width == socket->current_width) &&
(allocation->height == socket->current_height))
socket->need_map = FALSE;
}
+ gdk_flush ();
+ gdk_error_trap_pop ();
}
}
}
socket = GTK_SOCKET (widget);
if (socket->focus_in && socket->plug_window)
- XSetInputFocus (GDK_DISPLAY (),
- GDK_WINDOW_XWINDOW (socket->plug_window),
- RevertToParent, GDK_CURRENT_TIME);
+ {
+ gdk_error_trap_push ();
+ XSetInputFocus (GDK_DISPLAY (),
+ GDK_WINDOW_XWINDOW (socket->plug_window),
+ RevertToParent, GDK_CURRENT_TIME);
+ gdk_flush();
+ gdk_error_trap_pop ();
+ }
return TRUE;
}
/* FIXME: we might grab the focus even if we don't have
* it as an app... (and see _focus_in ()) */
if (socket->plug_window)
- XSetInputFocus (GDK_DISPLAY (),
- GDK_WINDOW_XWINDOW (socket->plug_window),
- RevertToParent, GDK_CURRENT_TIME);
+ {
+ gdk_error_trap_push ();
+ XSetInputFocus (GDK_DISPLAY (),
+ GDK_WINDOW_XWINDOW (socket->plug_window),
+ RevertToParent, GDK_CURRENT_TIME);
+ gdk_flush ();
+ gdk_error_trap_pop ();
+ }
}
static gint
break;
}
-
+
+ gdk_error_trap_push ();
XSendEvent (gdk_display,
GDK_WINDOW_XWINDOW (socket->plug_window),
False, NoEventMask, &xevent);
+ gdk_flush();
+ gdk_error_trap_pop ();
+
return TRUE;
}
else
event.xconfigure.border_width = 0;
event.xconfigure.above = None;
event.xconfigure.override_redirect = False;
-
+
+ gdk_error_trap_push ();
XSendEvent (gdk_display,
GDK_WINDOW_XWINDOW (socket->plug_window),
False, NoEventMask, &event);
+ gdk_flush ();
+ gdk_error_trap_pop ();
}
static void
{
GtkWidget *toplevel;
GdkDragProtocol protocol;
-
+
socket->plug_window = gdk_window_foreign_new (xid);
+ if (!socket->plug_window) /* Already gone */
+ return;
+
socket->same_app = FALSE;
-
+
+ gdk_error_trap_push ();
XSelectInput (GDK_DISPLAY (),
GDK_WINDOW_XWINDOW(socket->plug_window),
StructureNotifyMask | PropertyChangeMask);
-
+
if (gdk_drag_get_protocol (xid, &protocol))
gtk_drag_dest_set_proxy (GTK_WIDGET (socket), socket->plug_window,
protocol, TRUE);
+ gdk_flush ();
+ gdk_error_trap_pop ();
gdk_window_add_filter (socket->plug_window,
gtk_socket_filter_func, socket);
if (!socket->plug_window)
{
- g_print("Here!\n");
-
gtk_socket_add_window (socket, xcwe->window);
-
+
+ gdk_error_trap_push ();
gdk_window_move_resize(socket->plug_window,
0, 0,
widget->allocation.width,
widget->allocation.height);
+ gdk_flush ();
+ gdk_error_trap_pop ();
socket->request_width = xcwe->width;
socket->request_height = xcwe->height;
{
GTK_NOTE(PLUGSOCKET,
g_message ("GtkSocket - Map Request"));
-
+
+ gdk_error_trap_push ();
gdk_window_show (socket->plug_window);
+ gdk_flush ();
+ gdk_error_trap_pop ();
return_val = GDK_FILTER_REMOVE;
}
if ((xevent->xproperty.atom == gdk_atom_intern ("XdndAware", FALSE)) ||
(xevent->xproperty.atom == gdk_atom_intern ("_MOTIF_DRAG_RECEIVER_INFO", FALSE)))
{
+ gdk_error_trap_push ();
if (gdk_drag_get_protocol (xevent->xproperty.window, &protocol))
gtk_drag_dest_set_proxy (GTK_WIDGET (socket),
socket->plug_window,
protocol, TRUE);
+ gdk_flush ();
+ gdk_error_trap_pop ();
}
return_val = GDK_FILTER_REMOVE;
}
g_return_if_fail (window != NULL);
g_return_if_fail (GTK_IS_WINDOW (window));
-#ifdef G_ENABLE_DEBUG
- g_message ("add embedded xid %#x\n", xid);
-#endif
-
embedded_windows = gtk_object_get_data (GTK_OBJECT (window), "gtk-embedded");
if (embedded_windows)
gtk_object_remove_no_notify_by_id (GTK_OBJECT (window),
g_return_if_fail (window != NULL);
g_return_if_fail (GTK_IS_WINDOW (window));
-#ifdef G_ENABLE_DEBUG
- g_message ("remove embedded xid %#x\n", xid);
-#endif
-
embedded_windows = gtk_object_get_data (GTK_OBJECT (window), "gtk-embedded");
if (embedded_windows)
gtk_object_remove_no_notify_by_id (GTK_OBJECT (window),